package config

import (
	"github.com/joho/godotenv"
	"github.com/spf13/viper"
	"log"
	"os"
)

// Config 应用程序配置结构体
type Config struct {
	Server ServerConfig `yaml:"server"`
	OAuth2 OAuth2Config `yaml:"oauth2"`
	MySQL  MySQLConfig  `yaml:"mysql"`
	Redis  RedisConfig  `yaml:"redis"`
}

// ServerConfig 服务器配置结构体
type ServerConfig struct {
	Port string `yaml:"port"` // 服务器端口
}

// 全局应用配置实例
var AppConfig *Config

// LoadConfig 初始化配置
func LoadConfig() *Config {
	_ = godotenv.Load()

	env := os.Getenv("APP_ENV")
	if env == "" {
		env = "dev"
	}

	configPath := "yaml"
	configName := "config"

	v := viper.New()
	v.SetConfigName(configName)
	v.SetConfigType("yaml")
	v.AddConfigPath(configPath)

	if err := v.ReadInConfig(); err != nil {
		log.Fatalf("读取配置文件失败: %v", err)
	}

	envConfig := configName + "." + env + ".yaml"
	v.SetConfigName(envConfig)
	_ = v.MergeInConfig()

	v.AutomaticEnv()

	setDefaults(v)

	var cfg Config
	if err := v.Unmarshal(&cfg); err != nil {
		log.Fatalf("解析配置文件失败: %v", err)
	}

	AppConfig = &cfg
	return AppConfig
}

func setDefaults(v *viper.Viper) {
	v.SetDefault("server.port", ":8080")
	v.SetDefault("mysql.port", 3306)
	v.SetDefault("redis.port", 6379)
	v.SetDefault("redis.db", 0)
}